// 版权所有2016 etcd作者
// 
// 根据Apache许可证2.0版（以下简称“许可证”）获得许可；
// 除非遵守许可证，否则不得使用此文件。
// 您可以通过
// 
// www.apache.org/licenses/LICENSE-2.0 
// 
// 除非适用法律要求或书面同意，否则根据许可证分发的软件
// 按“原样”分发，
// 无任何明示或暗示的保证或条件。
// 请参阅许可证，了解管理许可的特定语言和
// 许可证下的限制。

package clientv3

import (
	"context"
	"crypto/tls"
	"time"

	"go.uber.org/zap"
	"google.golang.org/grpc"
)

type Config struct {
	// 端点是URL的列表。
	Endpoints []string `json:"endpoints"`

	// AutoSyncInterval是使用其最新成员更新端点的时间间隔。
	// 0禁用自动同步。默认情况下，禁用自动同步。
	AutoSyncInterval time.Duration `json:"auto-sync-interval"`

	// DialTimeout是无法建立连接的超时。
	DialTimeout time.Duration `json:"dial-timeout"`

	// DialkePaliveTime是客户端ping服务器以查看
	// 传输是否处于活动状态的时间。
	DialKeepAliveTime time.Duration `json:"dial-keep-alive-time"`

	// DialkePaliveTimeout是客户端等待
	// 保持活动探测响应的时间。如果此时未收到响应，则连接将关闭。
	DialKeepAliveTimeout time.Duration `json:"dial-keep-alive-timeout"`

	// MaxCallSendMsgSize是客户端请求发送限制，以字节为单位。
	// 如果为0，则默认为2.0 MiB（2*1024*1024）。
	// 确保“MaxCallSendMsgSize”<服务器端默认发送/接收限制。
	// /（“--max request bytes”标记到etcd或“embed.Config.MaxRequestBytes”）。
	MaxCallSendMsgSize int

	// MaxCallRecvMsgSize是客户端响应接收限制。
	// 如果为0，则默认为“math.MaxInt32”，因为范围响应可能会轻易超出请求发送限制。
	// 确保“MaxCallRecvMsgSize”>=服务器端默认发送/接收限制。
	// /（“--max request bytes”标志到etcd或“embed.Config.MaxRequestBytes”）。
	MaxCallRecvMsgSize int

	// TLS保存客户端安全凭据（如果有）。
	TLS *tls.Config

	// 用户名是用于身份验证的用户名。
	Username string `json:"username"`

	// 密码是用于身份验证的密码。
	Password string `json:"password"`

	// RejectOldCluster当设置时将拒绝针对过时的群集创建客户端。
	RejectOldCluster bool `json:"reject-old-cluster"`

	// DialOptions是grpc客户端（例如，拦截器）的拨号选项列表。
	// 例如，将“grpc.WithBlock（）”传递到block，直到基础连接启动。
	// 如果没有此选项，拨号会立即返回，并且在后台连接服务器。
	DialOptions []grpc.DialOption

	// 上下文是默认的客户端上下文；它可用于取消grpc拨出和
	// 其他没有显式上下文的操作。
	Context context.Context

	// 记录器设置客户端记录器。
	// 如果为零，则返回到构建日志配置。
	Logger *zap.Logger

	// LogConfig配置客户端记录器。
	// 如果为nil，则使用默认记录器。
	// TODO:配置gRPC记录器
	LogConfig *zap.Config

	// PermitWithoutStream当设置时，将允许客户端在没有任何活动流（RPC）的情况下向服务器发送持续ping。
	PermitWithoutStream bool `json:"permit-without-stream"`

	// TODO:支持自定义平衡器选择器
}
